/*
 * This code based on Silicon Graphics, Inc.'s redbook
 * http://www.opengl.org/resources/code/samples/redbook/
 */

/*
 * Copyright (C) 2008 aki@akjava.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * original code license
 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED 
 * Permission to use, copy, modify, and distribute this software for 
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that 
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. 
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 * 
 * US Government Users Restricted Rights 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
 */

package com.akjava.android.openglsamples.redbook;

import java.nio.FloatBuffer;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.content.Context;

import com.akjava.android.openglsamples.GLUT;


public class MaterialRenderer extends RedBookSimpleRenderer {


	private FloatBuffer no_mat;
	private FloatBuffer mat_ambient;
	private FloatBuffer mat_ambient_color;
	private FloatBuffer mat_diffuse;
	private FloatBuffer mat_specular;
	private FloatBuffer no_shininess;
	private FloatBuffer low_shininess;
	private FloatBuffer high_shininess;
	private FloatBuffer mat_emission;



	public MaterialRenderer(Context context) {
       super(context);
    }



    public void setUpBuffers() {
	no_mat = FloatBuffer.wrap(new float[]{ 0.0f, 0.0f, 0.0f, 1.0f });
	mat_ambient = FloatBuffer.wrap(new float[]{ 0.7f, 0.7f, 0.7f, 1.0f });
	mat_ambient_color = FloatBuffer.wrap(new float[]{ 0.8f, 0.8f, 0.2f, 1.0f });
	mat_diffuse = FloatBuffer.wrap(new float[]{ 0.1f, 0.5f, 0.8f, 1.0f});
	mat_specular = FloatBuffer.wrap(new float[]{ 1.0f, 1.0f, 1.0f, 1.0f });
	no_shininess = FloatBuffer.wrap(new float[]{ 0.0f });
	low_shininess = FloatBuffer.wrap(new float[]{ 5.0f });
	high_shininess = FloatBuffer.wrap(new float[]{ 100.0f });
	mat_emission = FloatBuffer.wrap(new float[]{0.3f, 0.2f, 0.2f, 0.0f});
    	   
    }
    

    public void onSurfaceChanged(GL10 gl, int w, int h) {
    	gl.glViewport(0, 0,w,h);
    	gl.glMatrixMode(GL10.GL_PROJECTION);
    	gl. glLoadIdentity();
    	   if (w <= (h*2))
    	      gl.glOrthof(-6f, 6f, (-3f*(float)h*2)/w,
    	              (3*(float)h*2)/w, -10.0f, 10.0f);
    	   else
    		   gl.glOrthof (-6*(float)w/h*2,
    	               6f*(float)w/h*2, -3f, 3f, -10.0f, 10.0f);
    	   gl.glMatrixMode(GL10.GL_MODELVIEW);
    	   gl.glLoadIdentity();
	   
    }



    public void onDrawFrame(GL10 gl) {
    	 
    	gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    	/*  draw sphere in first row, first column
    	 *  diffuse reflection only; no ambient or specular  
    	 */
    	  gl. glPushMatrix();
    	   gl.glTranslatef (-3.75f, 3.0f, 0.0f);
    	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, no_mat);
    	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, no_mat);
    	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, no_shininess);
    	   gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	   GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	   gl.glPopMatrix();

    	   /*  draw sphere in first row, second column
    	    *  diffuse and specular reflection; low shininess; no ambient
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (-1.25f, 3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, mat_specular);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, low_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in first row, third column
    	    *  diffuse and specular reflection; high shininess; no ambient
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (1.25f, 3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, mat_specular);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, high_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in first row, fourth column
    	    *  diffuse reflection; emission; no ambient or specular reflection
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (3.75f, 3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, no_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, mat_emission);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in second row, first column
    	    *  ambient and diffuse reflection; no specular  
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (-3.75f, 0.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, no_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in second row, second column
    	    *  ambient, diffuse and specular reflection; low shininess
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (-1.25f, 0.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, mat_specular);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, low_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in second row, third column
    	    *  ambient, diffuse and specular reflection; high shininess
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (1.25f, 0.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, mat_specular);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, high_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in second row, fourth column
    	    *  ambient and diffuse reflection; emission; no specular
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (3.75f, 0.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, no_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, mat_emission);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in third row, first column
    	    *  colored ambient and diffuse reflection; no specular  
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (-3.75f, -3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient_color);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, no_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in third row, second column
    	    *  colored ambient, diffuse and specular reflection; low shininess
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (-1.25f, -3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient_color);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, mat_specular);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, low_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in third row, third column
    	    *  colored ambient, diffuse and specular reflection; high shininess
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (1.25f, -3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient_color);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, mat_specular);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, high_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, no_mat);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();

    	   /*  draw sphere in third row, fourth column
    	    *  colored ambient and diffuse reflection; emission; no specular
    	    */
    	      gl.glPushMatrix();
    	      gl.glTranslatef (3.75f, -3.0f, 0.0f);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, mat_ambient_color);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, mat_diffuse);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, no_mat);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, no_shininess);
    	      gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, mat_emission);
    	      GLUT.glutSolidSphere(gl,1.0f, 16, 16);
    	      gl.glPopMatrix();
    }



	@Override
	public void onSurfaceCreated(GL10 gl, EGLConfig config) {setUpBuffers();
		   float ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
		   float diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
		   float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
		   float position[] = { 0.0f, 3.0f, 2.0f, 0.0f };
		   float lmodel_ambient[] = { 0.4f, 0.4f, 0.4f, 1.0f };
		   float local_view[] = { 0.0f };

		   gl.glClearColor(0.0f, 0.1f, 0.1f, 0.0f);
		   gl.glEnable(GL10.GL_DEPTH_TEST);
		   gl.glShadeModel(GL10.GL_SMOOTH);

		   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, FloatBuffer.wrap(ambient));
		   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, FloatBuffer.wrap(diffuse));
		   gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, FloatBuffer.wrap(position));
		   gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, FloatBuffer.wrap(lmodel_ambient));
		   //gl.glLightModelfv(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, local_view); //not supported

		   gl.glEnable(GL10.GL_LIGHTING);
		   gl.glEnable(GL10.GL_LIGHT0);

	}



	


	
}


